/*
 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.util;

/**
 * TimerTask类是设计用于在指定的时间或以一定的周期执行的任务。
 * 它是一个抽象类，必须由其子类实现run方法以定义任务的具体行为。
 */
public abstract class TimerTask implements Runnable {

    /**
     * 用于同步访问任务状态的锁对象。
     */
    final Object lock = new Object();

    /**
     * 任务状态常量，表示任务初始状态。
     */
    int state = VIRGIN;

    /**
     * 任务状态常量，表示任务已安排。
     */
    static final int VIRGIN = 0;

    /**
     * 任务状态常量，表示任务已安排。
     */
    static final int SCHEDULED = 1;

    /**
     * 任务状态常量，表示任务已执行。
     */
    static final int EXECUTED = 2;

    /**
     * 任务状态常量，表示任务已取消。
     */
    static final int CANCELLED = 3;

    /**
     * 下一次执行任务的时间。
     */
    long nextExecutionTime;

    /**
     * 任务的执行周期，对于非周期性任务，此值为0。
     */
    long period = 0;

    /**
     * 保护性构造函数，防止外部实例化。
     */
    protected TimerTask() {
    }

    /**
     * 抽象方法，由子类实现定义任务执行时的具体行为。
     */
    public abstract void run();

    /**
     * 取消任务的执行。
     * @return 如果任务处于已安排状态则返回true，否则返回false。
     */
    public boolean cancel() {
        synchronized(lock) {
            boolean result = (state == SCHEDULED);
            state = CANCELLED;
            return result;
        }
    }

    /**
     * 获取任务的计划执行时间。
     * @return 任务的计划执行时间，如果任务是周期性的，则为下一次执行的时间减去周期；否则为单一执行时间。
     */
    public long scheduledExecutionTime() {
        synchronized(lock) {
            return (period < 0 ? nextExecutionTime + period
                               : nextExecutionTime - period);
        }
    }
}
